; This module services the real time interrupt
;
; Get a Real Time interrupt every 40 microseconds (from Timer 0)
;
; This routine generates a 40usec pulse which turns on a Triac (via an opto-isolator)
; The 10msec LINE half cycle is divided into 250 40usec 'slots'
; The position of the TurnON pulse will vary the phase angle of the power control
;
; The PC Host provides 6 "brightness" values, these are counted down each half-cycle
;
; The Triacs are on Port A bits [5:0]
; A Line zero-cross detector is on Port C bit 0
;
ServiceTimerRoutine:
MOV DPTR, #PortC_Pins ; First check if we have just changes cycles
MOVX A, @DPTR
MOV DPTR, #PortA_OUT ; Will need this later
MOV C, LastCycle
JNB ACC.0, PositiveCycle ; Need an XRL C, but we don't have one!
CPL C
PositiveCycle:
JC SameCycle
CycleChange:
MOV C, ACC.0 ; Retreive current cycle
MOV LastCycle, C ; Save it for next time
MOV A, #10000000b ; Ensure all TurnON signals are low
MOVX @DPTR, A ; Trigger the 'scope on Bit 7
MOV R0, #LightValues
MOV R1, #WorkingValues
MOV R7, #6
CCLoop: MOV A, @R0 ; Get the Light Values
CPL A ; Since we count down
MOV @R1, A ; Update the Working Values
INC R0
INC R1
DJNZ R7, CCLoop ; Copy all six values
SameCycle: ; Check to see if any counters have expired
MOV R0, #WorkingValues
MOV Mask, #0 ; Allow for XCH
MOV A, #00100000b ; Turn on signal for a Triac
NextTriac:
XCH A, Mask ; Accumulate TurnON signals in A
MOV Temp, @R0
DJNZ Temp, KeepOFF
ORL A, Mask ; Set a TurnON bit
KeepOFF:MOV @R0, Temp
INC R0 ; Ready for next loop
XCH A, Mask
RR A ; Rotate Mask pattern
JNZ NextTriac
MOV A, Mask ; Retrieve TurnON pattern
MOVX @DPTR, A ; TurnON triac(s) if required
RET